package com.huida.app.hutoolsusage;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.CharsetUtil;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author wangzhuangzhuang
 * @DESC: 解决开发中各种类型转换问题。
 * @date 2022-01-10 10:34
 * Convert类是一个工具方法类，里面封装针对Java常见类型的转换，用于简化类型转换
 * Convert类中大部分方法为toXXX，参数为Object，可以实现将任意可能的类型转换为指定类型
 */
@SpringBootTest
public class ConvertUtilUsageDemo {

	// 1. 转换为字符串;
	@Test
	public void toStr() {
		int a = 1;
		// aStr = "1"
		String aStr = Convert.toStr(a);

		long[] b = {1, 2, 3, 4, 5, 6};
		// bStr = "[1, 2, 3, 4, 5, 6]"
		String bStr = Convert.toStr(b);

		System.out.println("aStr: " + aStr + " bStr: " + bStr);
	}

	// 2. 转换为指定类型数组
	@Test
	public void toIntArray() {
		String[] b = {"1", "2", "3", "4"};
		// 结果为Integer数组
		Integer[] intArray = Convert.toIntArray(b);
	}

	// 3. 转换为日期对象
	@Test
	public void toDate(){
		String a = "2017-05-06";
		Date value = Convert.toDate(a);
		System.out.println("date: " + value);
	}

	// 4. 转换为集合
	@Test
	public void toList(){
		Object[] a = {"a", "h", "i", "J"};
		List<?> list = Convert.convert(List.class, a);
		List<?> convertedList = Convert.toList(a);
		System.out.println(ArrayUtil.toString(convertedList)); // [a, h, i, J]
	}

	// 5. 半角转全角
	@Test
	public void toSBC(){
		String info = "123456789";

		// 结果为： “1 2 3 4 5 6 7 8 9"
		String s = Convert.toSBC(info);
		System.out.println("s: " + s); // s: １２３４５６７８９
	}

	// 6. 全角转半角
	@Test
	public void toDBC(){
		String info = "１２３４５６７８９";
		String s = Convert.toDBC(info);
		System.out.println("s: " + s); // s: 123456789
	}

	// 7. 16进制（Hex）
	@Test
	public void toHex(){
		String info = "Hello World - 你好，世界！";
		String hexStr = Convert.toHex(info, CharsetUtil.CHARSET_UTF_8);
		// hexStr: 48656c6c6f20576f726c64202d20e4bda0e5a5bdefbc8ce4b896e7958cefbc81
		System.out.println("hexStr: " + hexStr);
	}

	// 8. hexStrToStr
	@Test
	public void hexStrToStr(){
		String hexStr = "48656c6c6f20576f726c64202d20e4bda0e5a5bdefbc8ce4b896e7958cefbc81";

		String str = Convert.hexToStr(hexStr, CharsetUtil.CHARSET_UTF_8);

		System.out.println("str: " + str); // str: Hello World - 你好，世界！
	}

	// 9. Unicode和字符串转换(与16进制类似，Convert类同样可以在字符串和Unicode之间转换）
	@Test
	public void strToUnicode(){
		String a = "我是一个小小的可爱的字符串";

		String unicodeStr = Convert.strToUnicode(a);
		// unicodeStr: \u6211\u662f\u4e00\u4e2a\u5c0f\u5c0f\u7684\u53ef\u7231\u7684\u5b57\u7b26\u4e32
		System.out.println("unicodeStr: " + unicodeStr);

		String s = Convert.unicodeToStr(unicodeStr);
		// s: 我是一个小小的可爱的字符串
		System.out.println("s: " + s);
	}

	// 10. 编码转换
	@Test
	public void convertCharset(){
		String a = "你好*世界";
		// 转换后result为乱码
		String result = Convert.convertCharset(a, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);
		// result: ä½ å¥½*ä¸ç
		System.out.println("result: " + result);
		String raw = Convert.convertCharset(result, CharsetUtil.ISO_8859_1, "UTF-8");
		// raw: 你好*世界
		System.out.println("raw: " + raw);
	}

	// （★）时间单位转换 (Convert.convertTime)方法主要用于转换时长单位，比如一个很大的毫秒，获得这个毫秒数对应多少分钟
	@Test
	public void convertTime(){
		long a = 4535345;

		// 结果为： 75
		long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);

		long hours = Convert.convertTime(a, TimeUnit.MINUTES, TimeUnit.HOURS);

		long days = Convert.convertTime(a, TimeUnit.HOURS, TimeUnit.DAYS);

		System.out.println("minutes: " + minutes + " hours: " + hours + " days: " + days);
	}

	// （★）金额大小写（面对财务类需求，Convert.digitToChinese 将金钱数转换为大写形式
	// （⚠）转换为大写只能精确到分（小数点儿后两位），之后的数字会被忽略
	@Test
	public void digitToChinese(){
		double a = 67556.32;
		String s = Convert.digitToChinese(a);
		System.out.println("s: " + s); // s: 陆万柒仟伍佰伍拾陆元叁角贰分

	}

	// 数字转换

	// 1. 数字转为英文表达
	@Test
	public void toEngExpression(){
		double v = 100.23;
		String s = Convert.numberToWord(v);
		// s: ONE HUNDRED AND CENTS TWENTY THREE ONLY
		System.out.println("s: " + s);
	}

	// 2. 数字简化
	@Test
	public void numberToSimple(){
		double num01 = 15000;
		double num02 = 13000;
		double num03 = 14000;
		System.out.println(Convert.numberToSimple(num01)); // 1.5w
		System.out.println(Convert.numberToSimple(num02)); // 1.3w
		System.out.println(Convert.numberToSimple(num03)); // 1.4w
	}

	// 数字转中文(数字转中文方法中，只保留两位小数）
	@Test
	public void numberToChinesePlus(){
		String f1 = Convert.numberToChinese(10889.72356, false);
		System.out.println("f1: " + f1);

		// isUseTraditional => true用繁体 false用简体
		// 壹万贰仟陆佰伍拾叁
		System.out.println(Convert.numberToChinese(12653, true));
		// 一万二千六百五十三
		System.out.println(Convert.numberToChinese(12653, false));
	}



}